package main

import (
	"fmt"
	"strconv"
)

//给定一个数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
//
//返回滑动窗口中的最大值。
//
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/sliding-window-maximum

func max(a int, b int) int {
	if a > b {
		return a
	}
	return b
}

func maxSlidingWindow(nums []int, k int) []int {
	var n int
	if n = len(nums); n == 0 {
		return []int{}
	}
	if k == 1 {
		return nums
	}
	left, right := make([]int, n), make([]int, n)
	left[0] = nums[0]
	right[n-1] = nums[n-1]

	for i := 1; i < n; i++ {
		// from left to right
		if i%k == 0 {
			left[i] = nums[i]
		} else {
			left[i] = max(left[i-1], nums[i])
		}

		// from right to left
		j := n - i - 1
		if (j+1)%k == 0 {
			right[j] = nums[j]
		} else {
			right[j] = max(right[j+1], nums[j])
		}

		fmt.Println("--------" + strconv.Itoa(i) + "--------")
		fmt.Println(left)
		fmt.Println(right)
	}
	output := make([]int, n-k+1)
	for i := 0; i < n-k+1; i++ {
		output[i] = max(left[i+k-1], right[i])
	}
	return output
}

func main() {
	nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
	k := 3
	fmt.Println(maxSlidingWindow(nums, k))
}
